/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
/*
分析对于else那一部分，表示第一个符合条件但是仍要往右边搜索
即找到最大的i使得nums1[i - 1] <= nums2[j]
此时必有nums1[i] >= nums2[j]
进一步有nums1[i] >= nums2[j - 1]
*/
var findMedianSortedArrays = function (nums1, nums2) {
  if(nums1.length > nums2.length) {
    let temp = nums1
    nums1 = nums2
    nums2 = temp
  }
  let l1 = nums1.length, l2 = nums2.length
  let totalLeft = Math.ceil((l1 + l2) / 2)
  let left = 0, right = l1
  // nums1[i - 1] <= nums2[j] && nums2[j - 1] <= nums[i]
  while (left < right) {
      // 感觉这里也是保证i取不到0
      let i = (left + right + 1) >> 1
      let j = totalLeft - i
      if (nums1[i - 1] > nums2[j]) { // 不满足条件缩小区间
          right = i - 1
      } else { // 为什么没有判断nums[j - 1] > nums[i]，见分析
          left = i
      }
  }
  let i = left
  let j = totalLeft - left
  let leftMax1 = i == 0 ? Number.MIN_SAFE_INTEGER : nums1[i - 1]
  let rightMin1 = i == l1 ? Number.MAX_SAFE_INTEGER : nums1[i]
  let leftMax2 = j == 0 ? Number.MIN_SAFE_INTEGER : nums2[j - 1]
  let rightMin2 = j == l2 ? Number.MAX_SAFE_INTEGER : nums2[j]
  if ((l1 + l2) % 2 == 1) return Math.max(leftMax1, leftMax2)
  else return (Math.max(leftMax1, leftMax2) + Math.min(rightMin1, rightMin2)) / 2
};
function swap(a1, a2) {
  if (a1.length < a2.length) {
      let temp = a1
      a1 = a2
      a2 = temp
  }
}